/*
 * Copyright 2011 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package cl.jsoftlabs.gwt.soccer.server.services;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.UserTransaction;

import cl.jsoftlabs.gwt.soccer.client.bean.ContratoJugadorVO;
import cl.jsoftlabs.gwt.soccer.client.bean.JugadorVO;
import cl.jsoftlabs.gwt.soccer.client.services.JugadorService;
import cl.jsoftlabs.gwt.soccer.server.persistence.entities.ContratoJugador;
import cl.jsoftlabs.gwt.soccer.server.persistence.entities.Jugador;
import cl.jsoftlabs.gwt.soccer.server.persistence.entities.UtilEntities;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

public class JugadorServiceImpl extends RemoteServiceServlet implements JugadorService {

	private static final long serialVersionUID = 8728039345611174053L;

	@Override
	public String saludar(String nombre) {
		List<Jugador> items = findAll();
		return "Hola "+nombre;
	}

	@Override
	public List<JugadorVO> obtenerJugadores() {
		List<JugadorVO> vos = new ArrayList<JugadorVO>();
		List<Jugador> items = findAll();
		for (Iterator<Jugador> iterator = items.iterator(); iterator.hasNext();) {
			Jugador jugador = (Jugador) iterator.next();
			JugadorVO vo = jugador.toVO();
			vos.add(vo);
		}
		return vos;
	}
	
	@PersistenceContext
	EntityManager em;
	
	@Resource 
	UserTransaction transaction;
	
	public List<Jugador> findAll() {
		@SuppressWarnings("unchecked")
		List<Jugador> items  = em.createQuery("Select b from Jugador b").getResultList();
		return items;
	}
	
	public Integer generarIdJugador(){
		Long id = null;
		
		Query query = em.createNativeQuery("SELECT nextval('jugador_seq')");
		id = (Long) query.getSingleResult();

		return id.intValue();
	}

	@Override
	public JugadorVO obtenerRegistro(Integer idJugador) {
		Jugador e = new Jugador();
		Query query = em.createQuery("Select b from Jugador b where b.idJugador = :idJugador");
		query.setParameter("idJugador", idJugador);
		try {
			e = (Jugador) query.getSingleResult();
		} catch (NoResultException ex) {
			ex.printStackTrace();
		}
		return e.toVO();
	}
	
	@Override
	public Integer nuevoContrato(ContratoJugadorVO contrato) {
		ContratoJugador entity = UtilEntities.toEntity(contrato);
		System.out.println(entity);
		try {
			transaction.begin();
			if (entity.getIdContratoJugador().equals(0)) {
				System.out.println("Nuevo Registro "+entity);
				entity.setIdContratoJugador(generarIdSecuencia());
				em.persist(entity);
			}else{
				System.out.println("Modifica Registro "+entity);
				em.merge(entity);
			}
			transaction.commit(); 
			return 1;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return 2;
	}
	
	public Integer generarIdSecuencia(){
		Long id = null;
		
		Query query = em.createNativeQuery("SELECT nextval('contrato_jugador_seq')");
		id = (Long) query.getSingleResult();

		return id.intValue();
	}
}
